/*
 ╭──────────╮
╭│    ╭────╮
││    ╰────╯
││          │
╰│ ┌─────┌  │
 ╰─╯     ╰─╯ Lin.Meng. was a hardworking programmer.
                   No one can despise him.
                   And we have to bless his program without BUG!~    And program burned successfully!~
                   Bug,fuck out!!!!!!
                   :)
*/
/*                 .::::.
                 .::::::::.
                :::::::::::
             ..:::::::::::'
          '::::::::::::'
            .::::::::::
       '::::::::::::::..        女神助攻,程序烧写成功
            ..::::::::::::.     永不宕机,代码无bug
          ``::::::::::::::::
           ::::``:::::::::'        .:::.
          ::::'   ':::::'       .::::::::.
        .::::'      ::::     ..::::::'::::.
       .:::'       :::::  ..::::::::' ':::::.
      .::'        :::::..::::::::'      ':::::.
     .::'         ::::::::::::::'         ``::::.
 ...:::           ::::::::::::'              ``::.
```` ':.          ':::::::::'                  ::::..
                   '.:::::'                    ':'````..
*/
/*                   _ooOoo_
                    o8888888o
                   88\" . \"88
                   (|  $_$  |)    $
                    O\  =  /O
                ____/`---'\\____
              .'  \\\\|     |//  `.
             /   \\|||  :  |||//  \\
            /  _||||| -:- |||||-  \\
            |   | \\\\\\  -  /// |   |
            | \\_|  ''\\---/''  |   |
            \\  .-\\__  `-`  ___/-. /
          ___`. .'  /--.--\\  `. . ___
        .\"\" '<  `.___\\_<|>_/___.'  >'\"\".
      | | :  `- \\`.;`\\ _ /`;.`/ - ` : | |
      \\  \\ `-.   \\_ __\\ /__ _/   .-` /  /
========`-.____`-.___\\_____/___.-`____.-'========
                     `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


   佛祖保佑       永不宕机     永无BUG    程序烧写成功 */
/*
 ╭%╮ ╭'''╮ 
 (@^o^@) (⌒:⌒) 
 (~):(~) (~)v(~) 
*/

#include <ioCC2530.h>
#define SW1 P1_2      //宏定义，如下是LED宏定义
#define LED1 (P1_0)   //宏定义，LED1，简单好写。
#define LED2 (P1_1)   //宏定义，LED2，简单好写.
#define LED3 (P1_3)   //宏定义，LED3，简单好写。因为LED3在P1.3而非P1.2（Zigbee图纸）		（P1.2为RST）
#define LED4 (P1_4)   //宏定义，LED4，简单好写。因为LED4在P1.4而非P1.3（同上）			（P1.2为RST）
#define Ti2mer3 (P1_7)   //宏定义，第四单元T3计时器双通道测试写法（无用）
#define TImer3  (P1_6)   //宏定义，第四单元T3计时器单通道测试写法（无用）
unsigned char t1_Count=0;       //定时器1溢出次数计数。
unsigned int t3_Count=0;        //定时器3溢出次数计数。（char不能使用）
unsigned int t3_Co2unt=0;       //定时器3溢出次数计数。（同上理由，这行为双通道定义数据类型）
unsigned int t4_Count=0;        //定时器4溢出次数计数。
unsigned int t4_Co2unt=0;       //定时器4溢出次数计数。（t4双通道，查看ioCC2530.h头文件即可明晓）

/*第四单元T1计时器全局变量写法**
#pragma vector = T1_VECTOR
__interrupt void T1_INT(void)
{
  T1STAT &= ~0x20;    //清除定时器 1 溢出中断标志位
  t1_Count++;         //定时器 1 溢出次数加 1，溢出周期为 0.5 秒
  if(t1_Count == 3)
  {
    LED1=1;
    LED2=1;
  }
  if(t1_Count == 4)
  {
    LED1=0;
  }
  if(t1_Count == 5)
  {
    LED2=0;
    t1_Count=0;
  }
}
**第四单元T3计时器双通道第二题全局变量写法*/
#pragma vector = T3_VECTOR
__interrupt void T3_INT(void)
{
  IRCON = 0x00;      //清理中断标志，也可以通过硬件自清理。这一行去查看ioCC2530的Interrupt Flags 4
  t3_Count++;        //t3，使用int整数型。
/*if(t3_Count == 245)//测试code，0.5秒。没啥用了现在。
  {
    LED2=1;
  }
  if(t3_Count == 490)//同样测试code。1秒。
  {
    LED2=0;
    t3_Count=0;
  }
*/
/*if(t3_Count == 1470)//t3计时器达到3秒钟，完成任务1的第二步
  {
    LED1=1;
  }
  if(t3_Count == 3430)
  {
    LED1=0;
    t3_Count = 0;
  }
  t3_Co2unt++;       //t3，使用int整数型。
  if(t3_Co2unt == 490)
  {
    LED2=1;
  }
  if(t3_Co2unt == 1960)
  {
    LED2=0;
    t3_Co2unt = 0;
  }
}
*/
}
/*第四单元T4计时器双通道全局变量写法*/
#pragma vector = T4_VECTOR
__interrupt void T4_INT(void)
{
  IRCON = 0x00;      //清理中断标志，也可以通过硬件自清理。这一行去查看ioCC2530的Interrupt Flags 4
  t4_Count++;        //t3，使用int整数型。
  if(t4_Count == 1470)//t3计时器达到3秒钟，完成任务1的第二步
  {
    LED1=1;
  }
  if(t4_Count == 3430)
  {
    LED1=0;
    t4_Count = 0;
  }
  t4_Co2unt++;       //t3，使用int整数型。
  if(t4_Co2unt == 490)
  {
    LED2=1;
  }
  if(t4_Co2unt == 1960)
  {
    LED2=0;
    t4_Co2unt = 0;
  }
}
/***************************************************************************************************************
本次1.2.2020.1217.4-4Code版本，代码和写法均来自第四单元.pdf和CC2530中文数据手册完全版和头文件.
                               第四单元.pdf                 P13
                               CC2530中文数据手册完全版.pdf P74
                               ioCC2530.h                   C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.0\8051\bin
                               本次新增T4计时器写法，同时并没有删减T1\T3计时器写法。可以作为参考和模仿文件。
                               当然，代码可能还会存在一些某些场景出现的BUG（光是软件Rubild All后其实看不出来的）
                               所以，还是请大家认真使用，计时器看需使用。使用教程其实注释变相的写了。
                               注意，这里T3和T4的写法，其实是一样的，仔细看头文件其实也能看出相似端倪的。
                               我记得没错的话，头文件里面的这些T4什么的，其实可以用端口写法，在CC2530中文数据手册完全版.pdf里面也有端口介绍。
                               不过呢，既然都已经写出来了。剩下想继续挑战自我的，就试着端口写法吧。
                               废话不多说，把代码远程git下来，开始你们的C之旅吧！
                               欢迎大家认真使用，本代码已经同步至GITEE仓库，遵守BY-NC-SA4.0协议，转载请署名。
***************************************************************************************************************/
void main()
{
  P1SEL &= ~0x03;     //设置P1.0和P1.1为普通IO口。P1.0 P1.1为LED
  P1DIR |= 0x03;      //设置P1.0和P1.1为输出口。  P1.0 P1.1为LED
  LED1 = 0;           //熄灭 LED1
  LED2 = 0;           //熄灭 LED2  
  /******************第四单元定时器T1*****************
  T1CTL |= 0x0c;      //定时器1 时钟频率128分频
  T1CC0L = 0x12;      //设置最大计数值低8位
  T1CC0H = 0x7A;      //设置最大计数值高8位
  T1IE = 1;           //使能定时器1 中断
  T1OVFIM = 1;        //使能定时器1 溢出中断
  EA = 1;             //使能总中断
  T1CTL |= 0x03;      //定时器1 采用正计数/倒计数模式
  *******************第四单元定时器T3******************
  T3CTL |= 0xE0;      //定时器3 时钟频率128分频 设置最大计数值在此设置。
                      //推一下我的计算方式吧，因为我这一次跟老师不一样。
                      //首先，128分频,128/16000000*N=0.5S,N=62500
  T3IE = 1;           //使能定时器3      总中断                                  
  T3CCTL0 |= 0x08;    //使能定时器3通道1 溢出中断
  T3CCTL1 |= 0x08;    //使能定时器3通道2 溢出中断
  EA = 1;             //使能总中断
  T3CCTL0 &= ~0x03;   //定时器3通道1 采用 自由mode
                      //00->0xff 62500/255=245次。此时245次为0.5秒。
  T3CCTL1 &= ~0x03;   //定时器3通道2 采用 自由mode
                      //00->0xff 62500/255=245次。此时245次为0.5秒。
  T3CTL |= 0x10;      //启动 关键code 全局启动
  *******************第四单元定时器T4*****************/
  T4CTL |= 0xE0;      //定时器4 时钟频率128分频 设置最大计数值在此设置。
                      /*推一下我的计算方式吧，因为我这一次跟老师不一样。
                        首先，128分频,128/16000000*N=0.5S,N=62500
                      */
  T4IE = 1;           //使能定时器4      总中断                                  
  T4CCTL0 |= 0x08;    //使能定时器4通道1 溢出中断
  T4CCTL1 |= 0x08;    //使能定时器4通道2 溢出中断
  EA = 1;             //使能总中断
  T4CCTL0 &= ~0x03;   //定时器4通道1 采用 自由mode
                      /*00->0xff 62500/255=245次。此时245次为0.5秒。
                      */
  T4CCTL1 &= ~0x03;   //定时器4通道2 采用 自由mode
                      /*00->0xff 62500/255=245次。此时245次为0.5秒。
                      */
  T4CTL |= 0x10;      //启动 关键code 全局启动
}